package la.iok.hzsvn.lewin.movie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.entity.ClueCard;
import la.iok.hzsvn.lewin.movie.model.ClueCardParam;
import la.iok.hzsvn.lewin.movie.model.ClueCardVo;
import la.iok.hzsvn.lewin.movie.model.DigestInfo;
import la.iok.hzsvn.lewin.movie.model.ObsSignedUrl;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Set;

public interface ClueCardService extends BaseService<ClueCard,Long> {
    /**
     * 保存线索信息
     * @param token 操作用户
     * @param groupId 线索分组id
     * @param param 线索参数
     * @return 保存的线索记录id
     */
    @NotNull
    Long save(@NotNull Token token, @NotNull Long groupId, @NotNull ClueCardParam param);

    /**
     * 修改线索信息
     * @param token 操作用户
     * @param id 线索id
     * @param param 线索信息
     */
    void update(@NotNull Token token, @NotNull Long id, @NotNull ClueCardParam param);

    /**
     * 上传高清文件
     * @param token 操作用户
     * @param id 线索id
     * @param file 文件
     */
    void uploadHdFile(@NotNull Token token, @NotNull Long id, @NotNull String path, @NotNull MultipartFile file);

    ObsSignedUrl uploadHdFile(@NotNull Token token, @NotNull Long id, @NotNull DigestInfo digest);
    /**
     * 上传标清文件
     * @param token 操作用户
     * @param id 线索id
     * @param file 文件
     */
    void uploadSdFile(@NotNull Token token, @NotNull Long id, @NotNull String path, @NotNull MultipartFile file);
    ObsSignedUrl uploadSdFile(@NotNull Token token, @NotNull Long id, @NotNull DigestInfo digest);

    /**
     * 删除线索
     * @param token 操作用户
     * @param id 线索id
     */
    void delete(@NotNull Token token, @NotNull Long id);

    /**
     * 剧本所有线索列表
     * @param token 操作用户
     * @param movieId 剧本id
     * @return 线索列表
     */
    @NotNull
    @NotNullElement
    List<ClueCardVo> movieClueCards(@NotNull Token token, @NotNull Long movieId);

    /**
     * 查询指定线索分组的所有线索
     * @param groupIds 线索分组id列表
     * @return 线索列表
     */
    List<ClueCard> clueCards(@NotNull @NotNullElement Set<Long> groupIds);

    /**
     * 查询标清文件的摘要信息
     * @param id 线索卡id
     * @return 摘要信息
     */
    @Nullable
    String sdFileDigest(@Nullable Long id);

    /**
     * 查询标清文件的存储路径
     * @param id 线索卡id
     * @return 存储路径
     */
    @Nullable
    String sdFileStorePath(@Nullable Long id);
    /**
     * 查询高清文件的摘要信息
     * @param id 线索卡id
     * @return 摘要信息
     */
    @Nullable
    String hdFileDigest(@Nullable Long id);

    /**
     * 查询高清文件的存储路径
     * @param id 线索卡id
     * @return 存储路径
     */
    String hdFileStorePath(Long id);
    /**
     * 下载标清文件
     * @param token 操作用户
     * @param response 响应
     * @param id 线索卡id
     */
    void downloadSdFile(@NotNull Token token, @NotNull HttpServletResponse response, @NotNull Long id);
    /**
     * 下载高清文件
     * @param token 操作用户
     * @param response 响应
     * @param id 线索卡id
     */
    void downloadHdFile(@NotNull Token token, @NotNull HttpServletResponse response, @NotNull Long id);

    /**
     * 删除线索分组
     * @param token 操作用户
     * @param groupId 线索分组id
     */
    void deleteGroup(Token token, Long groupId);
}
